package tool;


import  java.io.*;
import java.sql.*;
import java.util.Properties;

/**
 * 数据库帮助类
 */
public class BaseDao{
    private static String driver;
    private static String url;
    private static String user;
    private static String pwd;

   protected Connection con=null;
   protected PreparedStatement pstmt=null;
   protected ResultSet rs=null;

    /**
     * 静态代码块
     */
    static{
        init();
    }

    //从配置文件中读取到连接属性
    public static void init(){
        //1、定义Properties对象 接收配置文件
        Properties per=new Properties();

        //2、使用流 读取到配置文件
        String file="database.properties";
        InputStream is=BaseDao.class.getClassLoader().getResourceAsStream(file);
        try {
            //把流读取到的配置文件 放入配置文件对象中
            per.load(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
        //3、使用配置文件对象 获取文件中相应的属性值
        driver=per.getProperty("driver");
        url=per.getProperty("url");
        user=per.getProperty("user");
        pwd=per.getProperty("password");
    }

    /**
     * 创建连接方法
     * @return
     */
    public Connection getConnection(){
        try {
            //1、加载驱动
            Class.forName(driver);
            //2、建立连接
            con= DriverManager.getConnection(url,user,pwd);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return con;
    }

    /**
     * 增删改操作
     * @param sql
     * @param params
     * @return
     */
    public int executeUpdate(String sql,Object[] params){
        int count=0;
        try {
            con=getConnection();
            pstmt=con.prepareStatement(sql);
            //如果参数列表有值 表示SQL中有条件
            if(null!=params){
                //循环遍历值列表
                for (int i = 0; i <params.length; i++) {
                    //每循环一次 就把值列表中的值替换到SQL的?
                    pstmt.setObject((i+1),params[i]);
                }
            }
            //执行SQL
            count=pstmt.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            this.close(null,pstmt,con);
        }
        return count;
    }

    /**
     * 查询方法
     * @param sql
     * @param params
     * @return
     */
    public ResultSet executeQuery(String sql,Object[] params){
        try {
            con=getConnection();
            pstmt=con.prepareStatement(sql);
            //如果参数列表有值 表示SQL中有条件
            if(null!=params){
                //循环遍历值列表
                for (int i = 0; i <params.length; i++) {
                    //每循环一次 就把值列表中的值替换到SQL的?
                    pstmt.setObject((i+1),params[i]);
                }
            }
            //执行SQL
            rs=pstmt.executeQuery();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return rs;
    }

    /**
     * 关闭连接方法
     * @param rs
     * @param pstmt
     * @param con
     */
    public void close(ResultSet rs, PreparedStatement pstmt,Connection con){
        try {
            //关闭Result对象
            if (null!=rs){
                rs.close();
            }
            if(null!=pstmt){
                pstmt.close();
            }
            if (null!=con){
                con.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }

    }
}
